package com.topgay.controller;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.topgay.domain.ComBoard;
import com.topgay.domain.Member;
import com.topgay.service.ComBoardService;

@Controller
@RequestMapping("/com/")
public class ComBoardController {

	@Autowired
	private ComBoardService comBoardService;

	// @RequestMapping("temp_list.do")
	// public String tempList(){
	//
	// return "community/boardmenu";
	// }
	/**
	 * 새글 입력 폼 이동 처리 handler메소드
	 * 
	 * @return String url
	 */
	@RequestMapping("write_form.do")
	public String writeForm() {
		return "community/write_form";
	}
	

	

	/**
	 * 새글 등록 처리 handler 메소드
	 * 
	 * @param qnaBoard
	 *            : QnABoard - client가 전송한 새글 정보 - nickname, title, content 가
	 *            요청파라미터로 전송됨
	 * @return ModelAndView : 정상흐름 - redirect 방식으로 getContent.do , 예외흐름 -
	 *         error.jsp 로 이동
	 */
	@RequestMapping("writeContent.do")
	public ModelAndView writeContent(ComBoard comBoard) {
		ModelAndView mv = null;
		System.out.println(comBoard);
		// 2. Business Logic - Model(Business Service)로 요청
		comBoardService.writeContent(comBoard);
		mv = new ModelAndView("redirect:getContent.do?no=" + comBoard.getNo());

		return mv;
	}

	// 내글목록조회
	@RequestMapping("write_form2.do")
	public String writeForm2() {
		return "mypage/write_form_mylist";
	}

	@RequestMapping("writeContent2.do")
	public ModelAndView writeContent2(ComBoard comBoard) {
		ModelAndView mv = null;
		System.out.println(comBoard);
		// 2. Business Logic - Model(Business Service)로 요청
		comBoardService.writeContent(comBoard);
		mv = new ModelAndView("redirect:getContent2.do?no=" + comBoard.getNo());

		return mv;
	}

	/**
	 * 글 목록 조회 처리 handler 메소드
	 * 
	 * @param page
	 *            String - 보고자 하는 list 페이지 번호
	 * @param model
	 *            ModelMap - list.jsp(목록페이지) 로 전송할 값을 저장할 객체
	 * @return String - list.jsp로 이동 처리
	 * @throws Exception
	 */
	@RequestMapping("list.do")
	public String list(@RequestParam(defaultValue = "1") String page,
			ModelMap model,HttpSession session, String id) throws Exception {

		String url = null;
		// 2. Business Logic 호출 ->model
		// page = 로 넘어온 경우(위 @RequestParam 설정은 page 요청파라미터
		// 이름으로 넘어온 것이 없는 경우이다.
		int pageNo = 1;
		try {
			pageNo = Integer.parseInt(page);

		} catch (Exception e) {
		}

		Member member = (Member)session.getAttribute("login_info");
		if(member!=null){
			id = member.getId();
			
		}

		Map map = comBoardService.getComBoardList(pageNo);
		
		model.addAllAttributes(map);

		url = "community/list";

		return url;
	}

	// /**
	// * 내 글 목록 조회 처리 handler 메소드
	// * @return
	// */
	// @RequestMapping("mylistIndex.do")
	// public String myListIndex(){
	// return "mypage/namelist";
	// }
	//

	/**
	 * 마이페이지 나의글 목록 조회 처리 handler 메소드
	 * 
	 * @param page
	 *            String - 보고자 하는 list 페이지 번호
	 * @param model
	 *            ModelMap - list.jsp(목록페이지) 로 전송할 값을 저장할 객체
	 * @return String - list.jsp로 이동 처리
	 * @throws Exception
	 */
	@RequestMapping("mylist.do")
	public String mylist(@RequestParam(defaultValue = "1") String page,
			String id, ModelMap model, HttpSession session) throws Exception {

		String url = null;
	
		int pageNo = 1;
		try {
			pageNo = Integer.parseInt(page);
		
		} catch (Exception e) {
		}

		Member member = (Member)session.getAttribute("login_info");
		if(member!=null){
			id = member.getId();
		}

		Map map = comBoardService.getComMyList(pageNo,id);

		model.addAllAttributes(map);

		url = "mypage/namelist";

		return url;
		
	
	}

		/*
		 * String url = null; //2. Business Logic 호출 ->model //page = 로 넘어온 경우(위
		 * @RequestParam 설정은 page 요청파라미터 // 이름으로 넘어온 것이 없는 경우이다. int pageNo = 1;
		 * System.out.println(id); // String id= null; try{ pageNo =
		 * Integer.parseInt(page); // Member member =
		 * (Member)session.getAttribute("login_info");
		 * 
		 * // id = member.getId(); // id = "111"; //임시아이디 }catch(Exception e){}
		 * 
		 * Map map = comBoardService.getComMyList(pageNo, id);
		 * System.out.println("adfadfadf"); model.addAllAttributes(map);
		 * 
		 * url = "mypage/namelist";
		 * 
		 * return url;
		 */
	

	/**
	 * 한개의 글(게시물)을 조회하는 handler 메소드
	 * 
	 * @param no
	 *            int - 조회하고자 하는 글번호
	 * @param map
	 *            ModelMap - 조회한 글 데이터를 저장할 ModelMap
	 * @return String - show_content.jsp 로 이동
	 */
	@RequestMapping("getContent.do")
	public String getContent(int no, ModelMap map,String id) {
		String url = null;

		try {
			// 2. Business Logic 요청 - Model
			ComBoard comBoard = comBoardService.getContentByNO(no);
			map.addAttribute("comBoard", comBoard);
			map.put("id", id);
			url = "community/show_content";
		} catch (Exception e) {
			e.printStackTrace();
			map.addAttribute("error_message", "글 조회도중 오류 발생: " + e.getMessage());
			url = "community/error";
		}
		return url;
	}

	// 내글조회
	@RequestMapping("getContent2.do")
	public String getContent2(int no, ModelMap map) {
		String url = null;

		try {
			// 2. Business Logic 요청 - Model
			ComBoard comBoard = comBoardService.getContentByNO(no);
			map.addAttribute("comBoard", comBoard);
			url = "mypage/show_content_mylist";
		} catch (Exception e) {
			e.printStackTrace();
			map.addAttribute("error_message", "글 조회도중 오류 발생: " + e.getMessage());
			url = "mypage/error";
		}
		return url;
	}

	/**
	 * 수정폼 으로 이동을 처리하는 handler 메소드
	 * 
	 * @param no
	 *            : int - 수정할 글 번호. 이 번호의 글을 조회해서 응답처리한다.
	 * @param map
	 *            : 수정할 글 데이터를 View에 전송하기 위한 ModelMap
	 * @return String : 정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로
	 *         이동
	 */

	@RequestMapping("getModifyForm.do")
	public String getModifyForm(HttpServletRequest request) {
		int no = Integer.parseInt(request.getParameter("no"));
		ComBoard co = comBoardService.getContentByNO(no);
		request.setAttribute("comBoard", co);
		return "community/modify_form";
	}

	@RequestMapping("modifyForm.do")
	public String modifyForm(int no, ModelMap map, ComBoard comBoard) {
		String url = null;
		try {
			// 2. B.L 처리
            System.out.println(comBoard);
//			ComBoard comBoard = comBoardService.getContentByNoForForm(no);
            comBoardService.modifyContent(comBoard);
			map.addAttribute("comBoard", comBoard);

			url = "community/success";

		} catch (Exception e) {
			e.printStackTrace();
			url = "community/error";
			map.addAttribute("error_message",
					"수정할 글 조회도중 오류발생 :" + e.getMessage());

		}
		return url;
	}

	/**
	 * 클라이언트가 수정한 글을 처리하기 위한 Handler 메소드
	 * 
	 * @param qnaBoard
	 *            : QnABoard - client가 전송한 게시물 수정 정보 - no, nickname, title,
	 *            content, viewcount, page번호 가 요청파라미터로 전송됨
	 * @return ModelAndView : 정상
	 */
	@RequestMapping("modifyContent.do")
	public ModelAndView modifyContent(ComBoard comBoard, int page) {
		ModelAndView mv = null;
		try {
			// 2. B.L 요청
			comBoardService.modifyContent(comBoard);
			mv = new ModelAndView("redirect:getContent.do?no="
					+ comBoard.getNo() + "&page=" + page);

		} catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("community/error", "error_message",
					"수정처리중 오류발생 : " + e.getMessage());

		}
		return mv;
	}

	/**
	 * 수정폼 으로 이동을 처리하는 handler 메소드
	 * 
	 * @param no
	 *            : int - 수정할 글 번호. 이 번호의 글을 조회해서 응답처리한다.
	 * @param map
	 *            : 수정할 글 데이터를 View에 전송하기 위한 ModelMap
	 * @return String : 정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로
	 *         이동
	 */

	@RequestMapping("getModifyForm2.do")
	public String getModifyForm2(HttpServletRequest request) {
		int no = Integer.parseInt(request.getParameter("no"));
		ComBoard co = comBoardService.getContentByNO(no);
		request.setAttribute("comBoard", co);
		return "mypage/modify_form_mylist";
	}

	//
	@RequestMapping("modifyForm2.do")
	public String modifyForm2(int no, ModelMap map,ComBoard comBoard) {
		String url = null;
		try {
			// 2. B.L 처리

			 comBoardService.modifyContent2(comBoard);
				map.addAttribute("comBoard", comBoard);

			url = "mypage/success_mylist";

		} catch (Exception e) {
			e.printStackTrace();
			url = "mypage/error_mylist";
			map.addAttribute("error_message",
					"수정할 글 조회도중 오류발생 :" + e.getMessage());

		}
		return url;
	}

	/**
	 * //mypage 글목록조회 수정폼으로 이동하는 메소드
	 * 
	 * @param qnaBoard
	 *            : QnABoard - client가 전송한 게시물 수정 정보 - no, nickname, title,
	 *            content, viewcount, page번호 가 요청파라미터로 전송됨
	 * @return ModelAndView : 정상
	 */
	@RequestMapping("modifyContent2.do")
	public ModelAndView modifyContent2(ComBoard comBoard, int page) {
		ModelAndView mv = null;
		try {
			// 2. B.L 요청
			comBoardService.modifyContent2(comBoard);
			mv = new ModelAndView("redirect:getContent2.do?no="
					+ comBoard.getNo() + "&page=" + page);

		} catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("mypage/error", "error_message",
					"수정처리중 오류발생 : " + e.getMessage());

		}
		return mv;
	}

	/**
	 * 글 삭제 처리 handler 메소드
	 * 
	 * @param no
	 *            : int - 삭제할 글 번호
	 * @return String - 정상흐름 : list.do (목록으로 이동), 예외흐름 : error.jsp
	 */
	@RequestMapping("deleteContent.do")
	public String deleteContent(int no, int page, ModelMap map) {
		String url = null;
		try {
			// 2.B.L로직
			comBoardService.deleteContentByNO(no);
			url = "redirect:list.do?page=" + page;
		} catch (Exception e) {
			e.printStackTrace();
			url = "community/error";
			map.addAttribute("error_message", "삭제도중 오류 발생 : " + e.getMessage());
		}
		return url;

	}

	// mypage 글목록조회 글을 삭제처리하는 메소드
	@RequestMapping("deleteContent2.do")
	public String deleteContent2(int no, int page, ModelMap map) {
		String url = null;
		try {
			// 2.B.L로직
			comBoardService.deleteContentByNO(no);
			url = "redirect:mylist.do?page=" + page;
		} catch (Exception e) {
			e.printStackTrace();
			url = "mypage/error";
			map.addAttribute("error_message", "삭제도중 오류 발생 : " + e.getMessage());
		}
		return url;

	}

	/**
	 * 답변 입력 폼 으로 이동을 처리하는 handler 메소드
	 * 
	 * @param no
	 *            : int - 답변하고자 하는 원본글의 번호. 답변 폼으로 원본글의 데이터를 보낸다.
	 * @return
	 */
	@RequestMapping("replyForm.do")
	public String replyForm(int no, ModelMap map, HttpSession session) {
		// 1. 요청 파라미터 조회 - no
		ComBoard comBoard = comBoardService.getContentByNoForForm(no);
		
		
		map.addAttribute("comBoard", comBoard);
		
		return "community/reply";

	}

	// mypage 나의글목록조회 답글폼으로 이동하는 메소드
	@RequestMapping("replyForm2.do")
	public String replyForm2(int no, ModelMap map) {
		// 1. 요청 파라미터 조회 - no
		ComBoard comBoard = comBoardService.getContentByNoForForm(no);
		map.addAttribute("comBoard", comBoard);
		return "mypage/reply_mylist";

	}

	/**
	 * 클라이언트가 전송한 답변 글을 등록하는 handler 메소드
	 * 
	 * @param qnaBoard
	 *            : QnABoard - client가 전송한 답변 게시물 정보 - nickname, title, content,
	 *            refamily, restep, relevel, page번호 가 요청파라미터로 전송됨
	 * @param page
	 *            : 원본글이 위치했던 page (처리후 목록 페이지 이동시 원본글이 있던 페이지로 이동하기 위해)
	 * @return ModelAndView - 정상흐름 - redirect 방식으로 getContent.do , 예외흐름 -
	 *         error.jsp 로 이동
	 */
	@RequestMapping("replyContent.do")
	public ModelAndView replyContent(ComBoard comBoard,HttpSession session,
			@RequestParam(required = false, defaultValue = "1") String page) {
		ModelAndView mv = null;
		Member member = (Member)session.getAttribute("login_info");
		comBoard.setId(member.getId()); 
		
		
		
		if (page.equals("")) {
			page = "1";
		}
		comBoardService.replyContent(comBoard);
		
		// 멱등처리
		mv = new ModelAndView("redirect:getContent.do?no=" + comBoard.getNo()
				+ "&page=" + page);
		return mv;

	}
	

	// mypage 나의글목록조회 답글을 등록하는 핸들러메소드
	@RequestMapping("replyContent2.do")
	public ModelAndView replyContent2(ComBoard comBoard,HttpSession session,
			@RequestParam(required = false, defaultValue = "1") String page) {
		ModelAndView mv = null;
		
		Member member = (Member)session.getAttribute("login_info");
		comBoard.setId(member.getId()); 
		
		
		if (page.equals("")) {
			page = "1";
		}
		comBoardService.replyContent(comBoard);
		// 멱등처리
		mv = new ModelAndView("redirect:getContent2.do?no=" + comBoard.getNo()
				+ "&page=" + page);
		return mv;

	}

}

